/******************************************************************************* * Copyright (c) 2000, 2013 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.ant.internal.ui.preferences; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.eclipse.ant.core.IAntClasspathEntry; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; /** * Content provider that maintains a list of classpath entries which are shown in a tree viewer. */ public class AntClasspathContentProvider implements ITreeContentProvider { private TreeViewer treeViewer; private ClasspathModel model = null; private boolean refreshEnabled = false; private boolean refreshRequested = false; public void add(IClasspathEntry parent, Object child) { Object newEntry = null; boolean added = false; if (parent == null || parent == model) { added = true; newEntry = model.addEntry(child); if (newEntry == null) { // entry already exists newEntry = model.createEntry(child, model); added = false; } parent = model; } else if (parent instanceof GlobalClasspathEntries) { GlobalClasspathEntries globalParent = (GlobalClasspathEntries) parent; newEntry = model.createEntry(child, globalParent); ClasspathEntry newClasspathEntry = (ClasspathEntry) newEntry; if (!globalParent.contains(newClasspathEntry)) { added = true; globalParent.addEntry(newClasspathEntry); } } if (newEntry != null) { if (added) { treeViewer.add(parent, newEntry); } treeViewer.setExpandedState(parent, true); treeViewer.setSelection(new StructuredSelection(newEntry), true); refresh(); } } public void add(int entryType, Object child) { Object newEntry = model.addEntry(entryType, child); if (newEntry != null) { treeViewer.add(getParent(newEntry), newEntry); refresh(); } } public void removeAll() { model.removeAll(); refresh(); } private void refresh() { if (refreshEnabled) { treeViewer.refresh(); refreshRequested = false; } else { refreshRequested = true; } } public void removeAllGlobalAntClasspathEntries() { model.removeAll(ClasspathModel.ANT_HOME); refresh(); } /** * @see ITreeContentProvider#getParent(Object) */ @Override public Object getParent(Object element) { if (element instanceof ClasspathEntry) { return ((ClasspathEntry) element).getParent(); } if (element instanceof GlobalClasspathEntries) { return model; } return null; } /** * @see ITreeContentProvider#hasChildren(Object) */ @Override public boolean hasChildren(Object element) { if (element instanceof ClasspathEntry) { return false; } if (element instanceof GlobalClasspathEntries) { return ((GlobalClasspathEntries) element).hasEntries(); } if (element instanceof ClasspathModel) { return ((ClasspathModel) element).hasEntries(); } return false; } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object) */ @Override public Object[] getElements(Object inputElement) { return getChildren(inputElement); } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.IContentProvider#dispose() */ @Override public void dispose() { // do nothing } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object) */ @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { treeViewer = (TreeViewer) viewer; if (newInput != null) { model = (ClasspathModel) newInput; } else { if (model != null) { model.removeAll(); } model = null; } } /* * (non-Javadoc) * * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object) */ @Override public Object[] getChildren(Object parentElement) { if (parentElement instanceof GlobalClasspathEntries) { return ((GlobalClasspathEntries) parentElement).getEntries(); } if (parentElement instanceof ClasspathModel) { return ((ClasspathModel) parentElement).getEntries(); } if (parentElement == null) { List<Object> all = new ArrayList<>(); Object[] topEntries = model.getEntries(); for (int i = 0; i < topEntries.length; i++) { Object object = topEntries[i]; if (object instanceof ClasspathEntry) { all.add(object); } else if (object instanceof GlobalClasspathEntries) { all.addAll(Arrays.asList(((GlobalClasspathEntries) object).getEntries())); } } return all.toArray(); } return null; } public void remove(IStructuredSelection selection) { Object[] array = selection.toArray(); model.removeAll(array); treeViewer.remove(array); refresh(); } public ClasspathModel getModel() { return model; } public void setRefreshEnabled(boolean refreshEnabled) { this.refreshEnabled = refreshEnabled; treeViewer.getTree().setRedraw(refreshEnabled); if (refreshEnabled && refreshRequested) { refresh(); } } /** * @param currentParent */ public void setEntries(IClasspathEntry currentParent, List<IAntClasspathEntry> entries) { if (currentParent instanceof GlobalClasspathEntries) { GlobalClasspathEntries group = (GlobalClasspathEntries) currentParent; group.setEntries(entries); } } }